﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

namespace PizzaWic.cooker
{
    /// <summary>
    /// permet l'acces à la bdd pour l'admin
    /// cette classe ne gère pas les erreurs en cas de mauvais paramètres (type, nombre, valeur)
    /// </summary>
    public class SqlAccess
    {
        private String connect = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=PizzaWic;Integrated Security=SSPI;Trusted_Connection=True;";

        //nom des paramètres des procédures stockées
        private Object[] validateParam = { "id_cook", "id_command" };
      
        
        /// <summary>
        /// permet de se connecter à la base
        /// </summary>
        /// <returns>un objet SqlConnection pour se deconnecter à la fin de la transaction</returns>
        private SqlConnection dbConnect()
        {
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connect;
            sqlConnection.Open();
            return sqlConnection;
        }

        
        /// <summary>
        /// permet d'exuter une procédure stockée
        /// </summary>
        /// <param name="sqlConnection"></param>
        /// <param name="ps">le nom de la procédure stockée</param>
        /// <param name="parameters">les paramètres de la procédure stockée</param>
        /// <returns>retourne éventuellement le résultat de la requète</returns>
        private DataSet psExecute(SqlConnection sqlConnection, String ps, Object[,] parameters)
        {
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.Connection = sqlConnection;
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.CommandText = ps;

            if (parameters != null)
                for (int i = 0; i < parameters.GetLength(1); i++)
                {
                    SqlParameter sqlParameter = new SqlParameter();
                    sqlParameter.ParameterName = (String)parameters[0, i];
                    sqlParameter.Value = parameters[1, i];
                    sqlCommand.Parameters.Add(sqlParameter);
                }

            DataSet dataSet = new DataSet();
            SqlDataAdapter sqlDataAdaptater = new SqlDataAdapter();
            sqlDataAdaptater.SelectCommand = sqlCommand;
            sqlDataAdaptater.Fill(dataSet);

            return dataSet;
        }

        /// <summary>
        /// renvoi les produits d'une commande
        /// </summary>
        /// <param name="parameters"></param>
        /// <returns></returns>
        internal DataSet getProductByCommand(Object parameters)
        {
            Object[,] param = new Object[2, 1];

            param[1, 0] = parameters;
            param[0, 0] = "id_command";

            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "command_product_read", param);
            sqlConnection.Close();
            return dataSet;
        }

        /// <summary>
        /// renvoi les commandes à réalisé
        /// </summary>
        /// <returns></returns>
        internal DataSet getCommandPending()
        {
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "command_pending_read", null);
            sqlConnection.Close();
            return dataSet;
        }

        /// <summary>
        /// permet de valider une commande
        /// </summary>
        /// <param name="parameters"></param>
        internal void validateCommand(object[] parameters)
        {
            Object[,] param = new Object[2, validateParam.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                param[1, i] = parameters[i];
                param[0, i] = validateParam[i];
            }

            SqlConnection sqlConnection = dbConnect();
            psExecute(sqlConnection, "command_validate", param);
            sqlConnection.Close();
        }
    }
}